/*
  Classe para conecção em Bancos de Dados
  Autor: Alcione Ferreira
  Criado em 09/11/2009
  Revisado em 10/12/2009

  ****************************************

  Class for connection to Database
  Author: Alcione Ferreira
  Created 09/11/2009
  Revised 10/12/2009
*/

#include <bancomy.h>

BANCOMY::BANCOMY(const char *arq_conf)
  	{
	int i;
	string con_file[5];
	string::size_type localizacao;
	
	//this->conn = NULL;
	//tipo = 1;
	this->query_result = 0;
	conf_file.append(arq_conf);
	this->conf.open(conf_file.c_str());

	//Fazendo a leitura do arquivo de configuração
	if (this->conf)
    	{
	  	for (i=0; i < 5; i++)
			{
			getline(this->conf,con_file[i]);
			//cout << con_file[i] << endl;
			}
	  	}
	
	this->conf.close();
  
	localizacao = con_file[0].find("=",0);
	if (localizacao != string::npos)
	  	{  
	  	//cout << con_file[0].substr(localizacao+1) << endl;
	  	this->host.append(con_file[0].substr(localizacao+1));
	  	}
	localizacao = con_file[1].find("=",0);
	if (localizacao != string::npos)
	  	{
	  	//cout << con_file[1].substr(localizacao+1) << endl;
	  	this->banco.append(con_file[1].substr(localizacao+1));
	  	}
	localizacao = con_file[2].find("=",0);
	if (localizacao != string::npos)
	  	{
	  	//cout << con_file[2].substr(localizacao+1) << endl;
	  	this->user.append(con_file[2].substr(localizacao+1)); 
	  	}
	localizacao = con_file[3].find("=",0);
	if (localizacao != string::npos)
	  	{
	  	//cout << con_file[3].substr(localizacao+1) << endl;
	  	this->senha.append(con_file[3].substr(localizacao+1)); 
	  	}
	localizacao = con_file[4].find("=",0);
	if (localizacao != string::npos)
	  	{
		//cout << con_file[4].substr(localizacao+1) << endl;
	  	this->tipo = atoi(con_file[4].substr(localizacao+1).c_str());
	  	}
  	this->conectar();
  	}

BANCOMY::~BANCOMY()
  	{
  	mysql_close(&this->conn);
	if (this->query_result == 2)
		{
		mysql_free_result(this->result);
		free(this->resultados);
		}
  	}

void BANCOMY::conectar()
  	{
  	string coneccao;

  	this->mensagem.clear();
  	mysql_init(&this->conn);
    if ( mysql_real_connect(&this->conn, this->host.c_str(), this->user.c_str(), this->senha.c_str(), this->banco.c_str(), 0, NULL, 0) )
    	{
		this->conectado = 1;
        this->mensagem.append("Conectado com sucesso!");
        }
    else
        {
		this->conectado = 0;
		this->mensagem.append("Falha ao conectar!\n");
        this->mensagem.append("Erro: ");
		this->mensagem.append(mysql_error(&conn));
        }
	 }

void BANCOMY::executar(char *query, int tpMY=1)
  	{
  	this->mensagem.clear();
  	if (this->conectado)
		{
		if (!mysql_query(&this->conn,query))
			{
			if (this->query_result == 2)
				{
			  	mysql_free_result(this->result);
				}
			switch (tpMY)
				{
			  	case 1:
					{
					this->query_result = 1;
					break;
					}
			  	case 2:
					{
					this->result = mysql_store_result(&this->conn);
					this->registros = mysql_num_rows(this->result);
					this->colunas = mysql_num_fields(this->result);
					break;
					}
			  	}
			}
		else
			{
			query_result = 3;
			mensagem.append("Erro: ");
	  	  	mensagem.append(itoa(mysql_errno(&this->conn),query,10));
			mensagem.append(" - ");
			mensagem.append(mysql_error(&this->conn));
			}
		}
  	}

/* Acessa todos os dados linha a linha, conforme for chamada, resultante de 
 	 uma consulta no banco de dados MySQL, grava-os no vetor this->resultados, 
   que é alocado dinamicamente conforme a quantidade de colunas resultantes da consulta
*/
void BANCOMY::resultado()
  	{
	unsigned int i;

	this->dados = mysql_fetch_row(this->result);
	this->resultados = new string[this->colunas];
	if (this->dados != NULL)
		{
		for (i=0; i < this->colunas; i++)
			{
			if (this->dados[i] == NULL)
				{
				this->resultados[i].append("");
				}
			else
				{
			  	this->resultados[i].append(converter(this->dados[i],2));
				}
			}
		}
	}
